import itertools

def fct(J,I):
    return([[I[0]+1,*I[1:I[0]],J[0],*I[I[0]:]],[*I[:I[0]+1],J[0],*I[I[0]+1:]]])
def calc (i,I):
    k=-1
    l=-1
    j=0
    while (k+1)*(l+1)==0 and j<len(I):
        if I[j]==i :
            k=j
        if I[j]==i+1:
            l=j
        j+=1    
    if l==-1:
        if k==-1:
            return([[1]+I])
        return([[1,*I[:k],i+1,*I[k+1:]]])            
    if k==-1:
        I0=[*I[:l],i,*I[l+1:]]
        I1=[*I[:l],i,*I[l:]]
        if l>0:
            I2=[*I[:l+1],i,*I[l+1:]]
            return([[1]+I0,[1]+I1,[-1]+I2])
        return([[1]+I0,[1]+I1])
    if k>0:
        if k<l: 
            return([[1,*I[:k],i+1,*I[k+1:l],i,*I[l+1:]]])
        return([[1,*I[:l],i,*I[l+1:k],i+1,*I[k+1:]]])
    J=I[1:l]
    J.reverse()
    L=[[2,i,*I[l:]]]
    while J!=[]:
        L=[fct(J,K)[j] for K in L for j in range(0,2)]
        J=J[1:]
    for K in L:
        K[0]=(-1)**(K[0]+1)
    return(L) 
def rpz(n,i):
    B=sorted([[j,*I] for j in range (1,n+1) for i in range(0,n-j+1) for I in itertools.permutations(range(j+1,n+1),r=i)],key=len)
    l=len(B)
    M=matrix([[0]*l]*l)
    for k in range(0,l):
        F=calc(i,B[k])
        for J in F:
            M[B.index(J[1:]),k]=J[0]
    return(M)

